package server;

import java.io.Serializable;

/**
 * Classe astratta utilizzata per definire i parametri e le possibili azioni che possono essere effettuate da un dinosauro. 
 */
public abstract class Dinosauro implements Serializable{

	private static final long serialVersionUID = 1L;
	private String idDino;
	private char tipo;
	private int movimento;
	private int dimensione;
	private int energiaMax;
	private int energia;
	private int forza;
	private int vita;
	private int vitaMax;
	private int posX;
	private int posY;
	
	/**
	 * Costruttore per inizializzare l'oggetto Dinosauro che deve essere creato.
	 * @param x Parametro di posizione riga.
	 * @param y Parametro di posizione colonna.
	 * @param id Identificatore del dinosauro, univoco per ogni oggetto creato.
	 */
	public Dinosauro(int x, int y, String id){
		
		this.dimensione = 1;
		this.energiaMax = 1000;
		this.energia = 1000;
		this.posX = x;
		this.posY = y;
		this.vitaMax = setVitaMax();
		this.vita = 1;
		this.idDino = id;
	}

	/**
	 * Restituisce l'identificatore del dinosauro.
	 * @return Stringa rappresentante l'id del dinosauro.
	 */
	public String getIdDino() {
		return idDino;
	}
	
	/**
	 * Restituisce la dimensione del dinosauro.
	 * @return Torna la dimensione corrente del dinosauro tramite una variabile di tipo int.
	 */
	public int getDimensione() {
		return dimensione;
	}

	/**
	 * Setta la dimensione del dinosauro.
	 * @param dimensione Imposta la dimensione del dinosauro.
	 */
	public void setDimensione(int dimensione) {
		this.dimensione = dimensione;
	}
	
	/**
	 * Restituisce 
	 * @return Ritorna l'energia massima del dinosauro tramite un tipo int.
	 */
	public int getEnergiaMax(){
		return this.energiaMax;
	}
	
	/**
	 * Setta l'energia massima del dinosauro.
	 * @param ene Energia massima del dinosauro.
	 */
	public void setEnergiaMax(int ene){
		this.energiaMax = ene;
	}

	/**
	 * Metodo che restituisce l'energia attuale del dinosauro.
	 * @return Torna una variabile di tipo int riguardo all'energia del dinosauro.
	 */
	public int getEnergia() {
		return energia;
	}

	/**
	 * Imposta l'energia da sommare a quella attuale del dinosauro. Nel caso l'energia risultante sia maggiore di quella massima possibile, l'energia viene posta uguale all'energia massima.
	 * @param ene Energia da sommare/sottrarre al dinosauro.
	 */
	public void setEnergia(int ene) {
		if(this.energia+ene > this.energiaMax){
			this.energia = this.energiaMax;
		}else{
			this.energia = this.energia + ene;
		}
		
	}

	/**
	 * Restituisce la forza attuale del dinosauro.
	 * @return Ritorna un int contenente la forza.
	 */
	public int getForza() {
		return forza;
	}

	/**
	 * Metodo che imposta la forza attuale del dinosauro.
	 * @param f Variabile rappresentante la forza attuale.
	 */
	public void setForza(int f){
		
		this.forza = f;
	}

	/**
	 * Restituisce l'età attuale del dinosauro.
	 * @return Tipo int con l'età attuale del dinosauro.
	 */
	public int getVita() {
		return vita;
	}

	/**
	 * Metodo che incrementa l'età del dinosauro.
	 * @return Torna un boolean uguale a true se l'età del dinosauro ha raggiunto l'età massima.
	 */
	public boolean incrementaVita() {
		
		this.vita = this.vita+1;
		if (this.vita < vitaMax)
			return false;
		else return true;
	}

	/**
	 * Ritorna la posizione della riga in cui è situato il dinosauro.
	 * @return Tipo int rappresentante la riga in cui è posto il dinosauro.
	 */
	public int getPosX() {
		return posX;
	}

	/**
	 * Setta la posizione della riga in cui è il dinosauro.
	 * @param posX Posizione di riga in cui è il dinosauro.
	 */
	public void setPosX(int posX) {
		this.posX = posX;
	}
	
	/**
	 * Ritorna la posizione dell colonna riga in cui è situato il dinosauro.
	 * @return Tipo int rappresentante la colonna in cui è posto il dinosauro.
	 */
	public int getPosY() {
		return posY;
	}

	/**
	 * Setta la posizione della riga in cui è il dinosauro.
	 * @param posX Posizione di riga in cui è il dinosauro.
	 */
	public void setPosY(int posY) {
		this.posY = posY;
	}

	/**
	 * Restituisce l'età massima raggiungibile da un dinosauro.
	 * @return Tipo int rappresentante la massima età del dinosauro.
	 */
	public int getVitaMax() {
		return vitaMax;
	}

	/**
	 * Imposta la massimo età del dinosauro con un valore random tra 26 e 34.
	 * @return Tipo int, la vita massima di un dinosauro.
	 */
	private int setVitaMax() {

		int x;
		double y;
		
		y = 12*Math.random();
		x = 24 + (int)y;
		
		return x;
	}
	
	/**
	 * Imposta il tipo del dinosauro appena creato, potendo assumenre i valori "c" per carnivoro o "e" per erbivoro.
	 * @param tip Tipo del dinosauro indicato sotto forma di carattere.
	 */
	public void setTipo(char tip){
		this.tipo = tip;
	}
	
	/**
	 * Ritorna un carattere indicante il tipo del dinosauro.
	 * @return Char indicante il tipo del dinosauro.
	 */
	public char getTipo(){
		return this.tipo;
	}
	
	/**
	 * Imposta il numero massimo di caselle attraversabili da un dinosauro in un turno. Valore uguale a 3 per i carnivori, 2 per gli erbivori.
	 * @param x Int uguale a 3 per i carnivori, 2 per gli erbivori.
	 */
	public void setMovimento(int x){
		this.movimento = x;
	}
	
	/**
	 * Restituisce il numero massimo di caselle attraversabili da un dinosauro.
	 * @return Tipo int che indica il movimento del dinosauro.
	 */
	public int getMovimento(){
		return this.movimento;
	}
	
	/**
	 * Metodo che permette la crescita di un dinosauro, aumentandone la sua dimensione. Nel caso la sua dimensione fosse già uguale a 5 (il massimo), essa non aumenterà ulteriormente.
	 */
	public abstract void evolvi();
}
